#include <head.h>

int main(int argc, char const *argv[])
{
    //创建套接字
    int sock = socket( AF_INET , SOCK_STREAM, 0);
    if(-1 == sock)
    {
        ERRLOG("创建套接字失败");
        exit(-1);
    }

    //填写信息结构体
        //使用的是 IPV4 网络信息结构体 不能使用通用信息结构体
    struct sockaddr_in server_addr;
        //清空结构体
    memset(&server_addr , 0 , sizeof(server_addr));
        //确定协议 选择IPV4
    server_addr.sin_family = AF_INET;
        //端口号
    server_addr.sin_port = htons(9997);//端口号可以随意制定
        //IP地址
    server_addr.sin_addr.s_addr = inet_addr("192.168.20.177");

    //绑定
    if(-1 == bind(sock , (struct sockaddr *)&server_addr , sizeof(server_addr)))
    {
        ERRLOG("绑定出错");
        close(sock);
        exit(-1);
    }

    printf("开始监听\n");
    //监听
    if(-1 == listen(sock , 1))
    {
        ERRLOG("监听失败");
        close(sock);
        exit(-1);
    }
    //等待连接
    int sock_client = accept(sock,NULL,NULL);
    printf("连接成功\n");
    //收发
    //发送一段信息
    send(sock_client,"你好，我是陈宇\n",strlen("你好，我是陈宇\n") , 0);
    
    //关闭连接
    close(sock);
    return 0;
}




/*
    struct sockaddr_in IPv4 地址结构

结构体原型

struct sockaddr_in {
    short int sin_family;          //地址族
    unsigned short int sin_port;   //端口号
    struct in_addr sin_addr;       //IP 地址
};

struct in_addr {
    uint32_t       s_addr;     //IP地址  网络字节序二进制
};

成员介绍

sin_family:
    地址族，与 struct sockaddr 中的 sa_family 相同。通常设置为 AF_INET，表示使用 IPv4 协议。

sin_port:
    表示端口号，使用 htons() 函数将主机字节序转换为网络字节序（大端序）。

sin_addr:
    是一个 struct in_addr 类型的结构体，用于存储 IPv4 地址。in_addr 结构体通常只有一个字段：
    struct in_addr {
        unsigned long s_addr;  //32 位 IPv4 地址
    };
	s_addr 通常使用 inet_aton() 或 inet_addr() 函数将点分十进制字符串转换为网络字节序的整数形式。

sin_zero:
    填充字段，用于确保 struct sockaddr_in 的大小与 struct sockaddr 相同。这个字段通常用 0 填充，没有特殊意义，只是为了对齐结构体的大小。

*/